package com.vegetable.modules.mapper.allocation;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.vegetable.modules.entity.allocation.AllocationCollection;
import com.vegetable.modules.entity.allocation.po.AllocationCollectionQueryDTO;
import com.vegetable.modules.entity.allocation.vo.AllocationCollectionDetailWithSalesInfo;
import com.vegetable.modules.entity.allocation.vo.SalesOrderCollectionVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * <p>
 * 分配回款主表 Mapper 接口
 * </p>
 *
 * @author Qoder
 * @since 2025-10-08
 */
@Mapper
public interface AllocationCollectionMapper extends BaseMapper<AllocationCollection> {

    /**
     * 生成单据编号
     * @return 单据编号
     */
    String getNextCode();

    /**
     * 分页查询分配回款列表，支持自定义查询条件
     * @param page 分页对象
     * @param queryDTO 查询参数DTO
     * @return 分页结果
     */
    IPage<AllocationCollection> selectPageWithConditions(Page<AllocationCollection> page, @Param("queryDTO") AllocationCollectionQueryDTO queryDTO);

    /**
     * 查询回款明细信息，根据不同的条件查询销售订单回款明细或客户回款汇总
     * @param salesOutId 销售出库单ID（可选）
     * @param customerId 客户ID（可选）
     * @return 回款明细列表
     */
    List<SalesOrderCollectionVO> selectCollectionDetails(@Param("salesOutId") Long salesOutId, @Param("customerId") Long customerId);

    /**
     * 根据条件查询回款情况
     * @param customerId 客户ID（可选）
     * @param orderNo 订单号（可选）
     * @param startTime 开始时间（可选）
     * @param endTime 结束时间（可选）
     * @return 回款情况列表
     */
    List<SalesOrderCollectionVO> selectCollectionDetailsByConditions(@Param("customerId") Long customerId, 
                                                                   @Param("orderNo") String orderNo, 
                                                                   @Param("startTime") String startTime, 
                                                                   @Param("endTime") String endTime);

    /**
     * 根据ID查询分配回款详情，包含销售订单信息
     * @param id 回款记录ID
     * @return 包含销售信息的分配回款明细列表
     */
    List<AllocationCollectionDetailWithSalesInfo> selectCollectionDetailWithSalesInfo(@Param("id") Long id);
    
    /**
     * 根据销售出库单ID查询分配回款详情，包含销售订单信息
     * @param salesOutId 销售出库单ID
     * @return 包含销售信息的分配回款明细列表
     */
    List<AllocationCollectionDetailWithSalesInfo> selectCollectionDetailWithSalesInfoBySalesOutId(@Param("salesOutId") Long salesOutId);
}